/*
 * @Author: LVGRAPE
 * @LastEditors: LVGRAPE
 */

#ifndef __ZINO_PIN_H_
#define __ZINO_PIN_H_

#include "at32f4xx_gpio.h"

#define ZINO_PIN_MODE_INPUT    GPIO_Mode_IN_FLOATING
#define ZINO_PIN_MODE_OUTPUT   GPIO_Mode_OUT_PP
#define ZINO_PIN_MODE_INPUT_PULLUP   GPIO_Mode_IN_PU
#define ZINO_PIN_MODE_INPUT_PULLDOWN GPIO_Mode_IN_PD
#define ZINO_PIN_MODE_OUTPUT_OD  GPIO_Mode_OUT_OD

typedef struct zino_io
{
    GPIO_Type *port;
    uint16_t pin;
} zino_io_t;
void zino_pin_mode_plus(GPIO_Type *port, uint16_t pin, GPIOMode_Type mode);
void zino_pin_mode(zino_io_t *io, GPIOMode_Type mode);
void zino_pin_write(zino_io_t *io, uint8_t value);
void zino_pin_low(zino_io_t *io);
void zino_pin_high(zino_io_t *io);
uint8_t zino_pin_read(zino_io_t *io);

#define PA0 GPIOA, GPIO_Pins_0
#define PA0 GPIOA, GPIO_Pins_0
#define PA1 GPIOA, GPIO_Pins_1
#define PA2 GPIOA, GPIO_Pins_2
#define PA3 GPIOA, GPIO_Pins_3
#define PA4 GPIOA, GPIO_Pins_4
#define PA5 GPIOA, GPIO_Pins_5
#define PA6 GPIOA, GPIO_Pins_6
#define PA7 GPIOA, GPIO_Pins_7
#define PA8 GPIOA, GPIO_Pins_8
#define PA9 GPIOA, GPIO_Pins_9
#define PA10 GPIOA, GPIO_Pins_10
#define PA11 GPIOA, GPIO_Pins_11
#define PA12 GPIOA, GPIO_Pins_12
#define PA13 GPIOA, GPIO_Pins_13
#define PA14 GPIOA, GPIO_Pins_14
#define PA15 GPIOA, GPIO_Pins_15
#define PB0 GPIOB, GPIO_Pins_0
#define PB1 GPIOB, GPIO_Pins_1
#define PB2 GPIOB, GPIO_Pins_2
#define PB3 GPIOB, GPIO_Pins_3
#define PB4 GPIOB, GPIO_Pins_4
#define PB5 GPIOB, GPIO_Pins_5
#define PB6 GPIOB, GPIO_Pins_6
#define PB7 GPIOB, GPIO_Pins_7
#define PB8 GPIOB, GPIO_Pins_8
#define PB9 GPIOB, GPIO_Pins_9
#define PB10 GPIOB, GPIO_Pins_10
#define PB11 GPIOB, GPIO_Pins_11
#define PB12 GPIOB, GPIO_Pins_12
#define PB13 GPIOB, GPIO_Pins_13
#define PB14 GPIOB, GPIO_Pins_14
#define PB15 GPIOB, GPIO_Pins_15
#define PC0 GPIOC, GPIO_Pins_0
#define PC1 GPIOC, GPIO_Pins_1
#define PC2 GPIOC, GPIO_Pins_2
#define PC3 GPIOC, GPIO_Pins_3
#define PC4 GPIOC, GPIO_Pins_4
#define PC5 GPIOC, GPIO_Pins_5
#define PC6 GPIOC, GPIO_Pins_6
#define PC7 GPIOC, GPIO_Pins_7
#define PC8 GPIOC, GPIO_Pins_8
#define PC9 GPIOC, GPIO_Pins_9
#define PC10 GPIOC, GPIO_Pins_10
#define PC11 GPIOC, GPIO_Pins_11
#define PC12 GPIOC, GPIO_Pins_12
#define PC13 GPIOC, GPIO_Pins_13
#define PC14 GPIOC, GPIO_Pins_14
#define PC15 GPIOC, GPIO_Pins_15
#define PD0 GPIOD, GPIO_Pins_0
#define PD1 GPIOD, GPIO_Pins_1
#define PD2 GPIOD, GPIO_Pins_2
#define PD3 GPIOD, GPIO_Pins_3
#define PD4 GPIOD, GPIO_Pins_4
#define PD5 GPIOD, GPIO_Pins_5
#define PD6 GPIOD, GPIO_Pins_6
#define PD7 GPIOD, GPIO_Pins_7
#define PD8 GPIOD, GPIO_Pins_8
#define PD9 GPIOD, GPIO_Pins_9
#define PD10 GPIOD, GPIO_Pins_10
#define PD11 GPIOD, GPIO_Pins_11
#define PD12 GPIOD, GPIO_Pins_12
#define PD13 GPIOD, GPIO_Pins_13
#define PD14 GPIOD, GPIO_Pins_14
#define PD15 GPIOD, GPIO_Pins_15
#define PF6 GPIOF, GPIO_Pins_6
#define PF7 GPIOF, GPIO_Pins_7

#define IO_Set(x) GPIO_SetBits(x)
#define IO_Reset(x) GPIO_ResetBits(x)
#define IO_Read(x) GPIO_ReadInputDataBit(x)
#endif
